package gps.api;

import java.awt.Point;

import gps.states.SquareState;

/**
 * GPSState interface.
 */
public interface GPSState {
	
	/**
	 * Setea el elemento element en la posicion (i,j)
	 * Lanza IllegalArgumentException si la coordenada no es valida
	 * 
	 * @param i
	 * 			Fila de la matriz
	 * @param j
	 * 			Columna de la matriz
	 * @param element
	 * 			Estado del elemento
	 * @throws IllegalArgumentException
	 */
	public void setElementState (int i, int j, SquareState element) throws IllegalArgumentException;
	
	/**
	 * Devuelve el estado del elemento en la posicion (i,j)
	 * Lanza IllegalArgumentException si la coordenada no es valida
	 * 
	 * @param i
	 * 			Fila de la matriz
	 * @param j
	 * 			Columna de la matriz
	 * @return
	 * @throws IllegalArgumentException
	 */
	public SquareState getElementState (int i, int j) throws IllegalArgumentException;
	
	/**
	 * Devuelve la coordenada del espacio vacio
	 * 
	 * @return
	 */
	public Point getBlank ();
	
	/**
	 * Esta funcion setea el blanco en la coordenada especificada.
	 * El metodo no chequea que ya haya un blanco, por lo tanto a la hora de setear la casilla como blanco 
	 * cerciorarse de que va a ser la unica en el tablero
	 * 
	 * @param i
	 * 			Fila de la matriz
	 * @param j
	 * 			Columna de la matriz
	 * @throws IllegalArgumentException
	 */
	public void setAsBlank (int i, int j) throws IllegalArgumentException;
	
	/**
	 * Compares self to another state to determine
	 * whether they are the same or not.
	 * @param state The state to compare to.
	 * @return true if self is the same as the state given,
	 * false if they are different.
	 */
	public boolean compare(GPSState state);
	
	
	public boolean simetric(GPSState state);
	
	public void copyState(GPSState state);
	
}
